﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BibliotecasDeBase.AccesoADatos;
using System.Collections;
using System.Data;

/// <summary>
/// Servicio de acceso a Notificaciones en la base de datos
/// </summary>
public class NotificacionServices
{
    private Ado ado;
    static public string EVENTO_COMENTARIO = "EVENTO_COMENTARIO";
    static public string EVENTO_SEGUIMIENTO = "EVENTO_SEGUIMIENTO";

	public NotificacionServices()
	{
        ado = new Ado();
	}
    /// <summary>
    /// Busca las últimas 4 notificaciones para el usuario que se pasa por parametro
    /// </summary>
    /// <param name="idUsuario">el id del usuario del cual se desea obtener las notificaciones</param>
    /// <returns>Lista de notificaciones del usuario cuyo id es pasado como parametro</returns>
    public List<Notificacion> BuscarNotificacionesListaUsuario(int idUsuario)
    {
        return BuscarNotificaciones(idUsuario, 4);
    }

    public List<Notificacion> BuscarNotificacionesVer(int idUsuario)
    {
        return BuscarNotificaciones(idUsuario, 100);
    }

    public List<Notificacion> BuscarNotificaciones(int idUsuario, int cantidad)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idUsuario);
        parametros.Add(cantidad);
        ado.EjecutarStoredProcedure(false, "Notificacion_BuscarNotificacionesUsuario", parametros);
        List<Notificacion> notificaciones = new List<Notificacion>();
        foreach (DataRow row in ado.DevolverDataTable().Rows)
        {
            notificaciones.Add(CrearNotificacionDesdeRow(row));
        }
        return notificaciones;
    }

    public int ContarNotificacionesNoLeidas(int idUsuario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idUsuario);
        ado.EjecutarStoredProcedure(false, "Notificacion_ContarNotificacionesNoLeidas", parametros);
        return Convert.ToInt32(ado.DevolverDataTable().Rows[0]["cantidad"]);
    }

    /// <summary>
    /// Crea una notificacion desde un DataRow
    /// </summary>
    /// <param name="row">DataRow desde el cual se desea crear una notificacion</param>
    /// <returns>Una notificacion</returns>
    private Notificacion CrearNotificacionDesdeRow(DataRow row)
    {
        int idNotificacion = Convert.ToInt32(row["id_notificacion"]);
        int usuarioId = Convert.ToInt32(row["usuario_id"]);
        string codigoEvento = row["codigo_evento"].ToString();
        int postId = 0;
        if(codigoEvento.Equals(EVENTO_COMENTARIO))
         postId = Convert.ToInt32(row["post_id"]);
        
        bool leida = Convert.ToBoolean(row["leida"]);
        Notificacion notificacion = new Notificacion(idNotificacion, usuarioId, postId, codigoEvento, leida);
        notificacion.NotificadoId = Convert.ToInt32(row["notificado_id"]);
        return notificacion;
    }
    /// <summary>
    /// Inserta en la base de datos una notificacion de seguimiento donde el usuario seguido es el notificado y el usuario seguidor es el notificador
    /// </summary>
    /// <param name="usuarioSeguido">usuario notificado</param>
    /// <param name="usuarioSeguidor">usuario notificador</param>
    public void InsertarNotificacionSeguimiento(int usuarioSeguido, int usuarioSeguidor)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(usuarioSeguido);
        parametros.Add(usuarioSeguidor);
        ado.EjecutarStoredProcedure(true, "Notificacion_InsertarNotificacionSeguimiento", parametros);  
    }
    /// <summary>
    /// Inserta en la base de datos una notificacion de comentario en un post, donde el usuario notificador es quien comenta y el usuario notificado es cualquier
    /// participante del post, es decir, el creador u otro usuario que haya comentado el post.
    /// </summary>
    /// <param name="idPost">id del post que fue comentado</param>
    /// <param name="notificador">id del usuario que comentó el post</param>
    public void InsertarNotificacionComentario(int idPost, int notificador)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idPost);
        parametros.Add(notificador);
        ado.EjecutarStoredProcedure(true, "Notificacion_InsertarNotificacionComentario", parametros); 
    }


    internal void LeerNotificacion(int idNotificacion, int idNotificado)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idNotificacion);
        parametros.Add(idNotificado);
        ado.EjecutarStoredProcedure(false, "Notificacion_MarcarLeidaUsuario", parametros);
    }

    
}